/*!
 * \file EventNotifier.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 事件通知器头文件
 * 
 * 事件通知器是WonderTrader系统中用于事件广播和通知的组件，
 * 主要功能包括：
 * 1. 通过消息队列（MQ）发布交易事件通知
 * 2. 支持交易成交、订单状态变化等事件的实时推送
 * 3. 提供日志事件和自定义事件的通知机制
 * 4. 支持JSON格式的结构化消息发布
 * 
 * 该组件为系统提供统一的事件通知和消息广播服务，
 * 便于外部系统或监控工具实时获取交易状态信息。
 */
#pragma once

#include <queue>

#include "../Includes/WTSMarcos.h"
#include "../Includes/WTSObject.hpp"
#include "../Share/StdUtils.hpp"

/**
 * @typedef FuncCreateMQServer
 * @brief 创建消息队列服务器函数指针类型
 * @param url 消息队列服务器URL
 * @return 服务器句柄
 */
typedef unsigned long(*FuncCreateMQServer)(const char*);

/**
 * @typedef FuncDestroyMQServer
 * @brief 销毁消息队列服务器函数指针类型
 * @param handle 服务器句柄
 */
typedef void(*FuncDestroyMQServer)(unsigned long);

/**
 * @typedef FundPublishMessage
 * @brief 发布消息函数指针类型
 * @param handle 服务器句柄
 * @param topic 消息主题
 * @param data 消息数据
 * @param length 数据长度
 */
typedef void(*FundPublishMessage)(unsigned long, const char*, const char*, unsigned long);

/**
 * @typedef FuncLogCallback
 * @brief 日志回调函数指针类型
 * @param id 标识符
 * @param message 日志消息
 * @param bServer 是否为服务器日志
 */
typedef void(*FuncLogCallback)(unsigned long, const char*, bool);

/**
 * @typedef FuncRegCallbacks
 * @brief 注册回调函数指针类型
 * @param callback 回调函数
 */
typedef void(*FuncRegCallbacks)(FuncLogCallback);

NS_WTP_BEGIN
class WTSTradeInfo;
class WTSOrderInfo;
class WTSVariant;

/**
 * @class EventNotifier
 * @brief 事件通知器类
 * 
 * 事件通知器负责系统中各种事件的通知和广播：
 * 1. 初始化和管理消息队列连接
 * 2. 将交易成交信息转换为JSON格式并发布
 * 3. 将订单状态变化转换为JSON格式并发布
 * 4. 提供日志事件和自定义事件的通知接口
 * 5. 支持多种消息主题的分类发布
 * 
 * 该类为交易系统提供统一的事件通知机制，
 * 便于外部系统实时监控交易状态和系统运行情况。
 */
class EventNotifier
{
public:
	/**
	 * @brief 构造函数
	 * 
	 * 初始化事件通知器
	 */
	EventNotifier();
	
	/**
	 * @brief 析构函数
	 * 
	 * 清理事件通知器资源，销毁消息队列连接
	 */
	~EventNotifier();

private:
	/**
	 * @brief 将交易信息转换为JSON格式
	 * @param trader 交易接口名称
	 * @param localid 本地订单ID
	 * @param stdCode 标准合约代码
	 * @param trdInfo 交易信息对象
	 * @param output 输出的JSON字符串
	 * 
	 * 将交易成交信息转换为结构化的JSON格式，
	 * 包含交易方向、开平仓类型、成交量、成交价等信息
	 */
	void	tradeToJson(const char* trader, uint32_t localid, const char* stdCode, WTSTradeInfo* trdInfo, std::string& output);
	
	/**
	 * @brief 将订单信息转换为JSON格式
	 * @param trader 交易接口名称
	 * @param localid 本地订单ID
	 * @param stdCode 标准合约代码
	 * @param ordInfo 订单信息对象
	 * @param output 输出的JSON字符串
	 * 
	 * 将订单状态信息转换为结构化的JSON格式，
	 * 包含订单状态、委托量、成交量等信息
	 */
	void	orderToJson(const char* trader, uint32_t localid, const char* stdCode, WTSOrderInfo* ordInfo, std::string& output);

public:
	/**
	 * @brief 初始化事件通知器
	 * @param cfg 配置信息
	 * @return 是否初始化成功
	 * 
	 * 根据配置信息初始化事件通知器：
	 * 1. 检查是否启用事件通知功能
	 * 2. 加载消息队列模块
	 * 3. 创建消息队列服务器连接
	 * 4. 注册必要的回调函数
	 */
	bool	init(WTSVariant* cfg);

	/**
	 * @brief 通知交易成交事件
	 * @param trader 交易接口名称
	 * @param localid 本地订单ID
	 * @param stdCode 标准合约代码
	 * @param trdInfo 交易信息对象
	 * 
	 * 发布交易成交事件通知，主题为"TRD_TRADE"
	 */
	void	notify(const char* trader, uint32_t localid, const char* stdCode, WTSTradeInfo* trdInfo);
	
	/**
	 * @brief 通知订单状态变化事件
	 * @param trader 交易接口名称
	 * @param localid 本地订单ID
	 * @param stdCode 标准合约代码
	 * @param ordInfo 订单信息对象
	 * 
	 * 发布订单状态变化事件通知，主题为"TRD_ORDER"
	 */
	void	notify(const char* trader, uint32_t localid, const char* stdCode, WTSOrderInfo* ordInfo);
	
	/**
	 * @brief 通知交易接口消息
	 * @param trader 交易接口名称
	 * @param message 消息内容
	 * 
	 * 发布交易接口相关消息通知，主题为"TRD_NOTIFY"
	 */
	void	notify(const char* trader, const char* message);

	/**
	 * @brief 通知日志事件
	 * @param tag 日志标签
	 * @param message 日志消息
	 * 
	 * 发布日志事件通知，主题为"LOG"
	 */
	void	notifyLog(const char* tag, const char* message);

	/**
	 * @brief 通知自定义事件
	 * @param message 事件消息
	 * 
	 * 发布自定义事件通知，主题为"GRP_EVENT"
	 */
	void	notifyEvent(const char* message);

private:
	std::string		m_strURL;		///< 消息队列服务器URL
	uint32_t		_mq_sid;		///< 消息队列服务器句柄
	FuncCreateMQServer	_creator;	///< 创建服务器函数指针
	FuncDestroyMQServer	_remover;	///< 销毁服务器函数指针
	FundPublishMessage	_publisher;	///< 发布消息函数指针
	FuncRegCallbacks	_register;	///< 注册回调函数指针
};

NS_WTP_END